//package com.jzo2o.market.service;
//
//import cn.hutool.core.thread.ThreadUtil;
//import com.jzo2o.redis.model.SyncMessage;
//import lombok.extern.slf4j.Slf4j;
//import org.junit.jupiter.api.Test;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.data.redis.core.Cursor;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.ScanOptions;
//
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//@SpringBootTest
//@Slf4j
//public class SyncThreadPoolTest2 {
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    @Autowired
//    private RedissonClient redissonClient;
//
//    public class RunnableSimple implements Runnable {
//
//        private int index;
//
//        public RunnableSimple(int index) {
//            this.index = index;
//        }
//
//        @Override
//        public void run() {
//            // 指定锁名称，每个队列只有一个线程去处理，锁粒度为队列，锁名称在队列名称前加Lock:
//            String lockName = String.format("Lock:QUEUE:COUPON:SEIZE:SYNC:{%s}", index);
//            String queue = String.format("QUEUE:COUPON:SEIZE:SYNC:{%s}", index);
//
//            RLock lock = redissonClient.getLock(lockName);
//
//            try {
//                // 2.尝试获取锁，参数：waitTime、leaseTime、时间单位
//                boolean isLock = lock.tryLock(3, 10, TimeUnit.SECONDS);
//                if (isLock) {
//                    //获取数据
//                    Cursor<Map.Entry<String, Object>> cursor = redisTemplate.opsForHash().scan(queue, ScanOptions.scanOptions().count(10).build());
//                    //遍历数据转换成SyncMessage列表
//                    List<SyncMessage<Object>> collect = cursor.stream()
//                            .map(e -> new SyncMessage<Object>(e.getKey().toString(), e.getValue(), null))
//                            .collect(Collectors.toList());
//
//                    if (index == 1) {
//                        ThreadUtil.sleep(10000);
//                    }
//
//                    log.info("{}获取{}数据{}条", Thread.currentThread().getId(), queue, collect.size());
//                    collect.stream().forEach(System.out::println);
//                    // 关闭游标
//                    if (cursor != null) {
//                        cursor.close();
//                    }
//                } else {
//                    log.info("!!!!!!{}获取{}队列的锁失败", Thread.currentThread().getId(), queue);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                // 4.释放锁
//                if (lock != null && lock.isLocked()) {
//                    lock.unlock();
//                }
//            }
//        }
//    }
//
//    @Autowired
//    @Qualifier("syncThreadPool")
//    private ThreadPoolExecutor threadPoolExecutor;
//
//    @Test
//    public void testThreadPool() {
//        for (int i = 0; i < 10; i++) {
//            threadPoolExecutor.execute(new RunnableSimple(i));
//        }
//
//        ThreadUtil.sleep(5000);
//
//        for (int i = 0; i < 10; i++) {
//            threadPoolExecutor.execute(new RunnableSimple(i));
//        }
//
//        ThreadUtil.sleep(1, TimeUnit.MINUTES);
//    }
//}